package com.gjm.demo.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

//@Component
@Slf4j
@Aspect
@Order(1) //定义优先级，值越小，优先级越高
public class AspectTest2 {

//    /**
//     * 在方法运行前后都会执行
//     * @param proceedingJoinPoint
//     * @throws Throwable
//     */
//    @Around("execution(* com.gjm.demo.controller.*.*(..))")
//    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//        log.info("around before");
//
//        Object proceed = proceedingJoinPoint.proceed();
//
//        log.info("around after");
//    }

    /**
     * Around 可以涵盖 Before, After, AfterReturning, AfterThrowing
     * @param proceedingJoinPoint
     */
    @Around("com.gjm.demo.aspect.AspectTest1.pt()") //使用 AspectTest1 里面定义的切点，需要使用切点的完整路径
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        log.info("around before2");

        log.info("before2");

        Object result = null;

        try {
            result = proceedingJoinPoint.proceed();
        } catch (Throwable e) {
//            throw new RuntimeException(e);
            log.error("throwing");
        }

        log.info("after2");

        log.info("around after2");

        return result;
    }

//    /**
//     * 在方法运行前执行
//     */
//    @Before("execution(* com.gjm.demo.controller.*.*(..))")
//    public void before() {
//        log.info("before");
//    }
//
//    /**
//     * 在方法运行完成后执行, 在 AfterReturning 和 AfterThrowing 之后
//     */
//    @After("execution(* com.gjm.demo.controller.*.*(..))")
//    public void after() {
//        log.info("after");
//    }
//
//    /**
//     * 在方法返回后执行
//     */
//    @AfterReturning("execution(* com.gjm.demo.controller.*.*(..))")
//    public void afterReturning() {
//        log.info("afterReturning");
//    }
//
//    /**
//     * 在方法抛出异常后执行
//     */
//    @AfterThrowing("execution(* com.gjm.demo.controller.*.*(..))")
//    public void afterThrowing() {
//        log.info("afterThrowing");
//    }
}
